// 给定一个字符串，请你找出其中不含有重复字符的 最长子串 的长度。

 

// 示例 1:
// 输入: s = "abcabcbb"
// 输出: 3 
// 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。


// 示例 2:
// 输入: s = "bbbbb"
// 输出: 1
// 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。


// 示例 3:
// 输入: s = "pwwkew"
// 输出: 3
// 解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
//      请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。


// 示例 4:
// 输入: s = ""
// 输出: 0





/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function (s) {
    let
        left = 0,
        right = 0,
        window = {},
        len = 0;
    while (right < s.length) {
        let right_char = s[right];
        right++;
        if (window[right_char] === undefined) {
            window[right_char] = 1;
        } else {
            window[right_char]++;
        }
        if ([...Object.values(window)].every(item => item <= 1) && ((right - left) > len)) {
            len = right - left;
        }
        while ([...Object.values(window)].some(item => item > 1)) {
            let left_char = s[left];
            left++;
            if (window[left_char] !== undefined) {
                window[left_char]--;
            }
        }
    }
    return len;
};